// 线程中止
public class ThreadDemo8 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            // currentThread() 这个方法是获取到当前线程对象的实例, 相当与拿到 t
            // isInterrupted() 判断是否设置标志位, 不会清除标志位
            // Thread.interrupted 也是判断是否设置标志位, 但是会清除标志位
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("hello t");
                try {
                    Thread.sleep(1000);
                    // 执行sleep这个方法时, 如果标志位设置了
                    // 会中止休眠, 进入catch抛出异常, 并且清除标志位
                    // 清除了标志位, 循环就不会结束
                    // 解决办法, 在catch中, 加入break
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }

                // 如果刚好休眠完, 这时候主线程修改标志位
                // 就不会进入sleep
                // 直接到while的条件, 然后结束循环
                // 但是这个概率很低, 因为休眠1秒 占据了这个线程的99.999%的时间
            }
        });

        // t线程启动
        t.start();

        // main 休眠3秒
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 设置标志位
        t.interrupt();
    }
}
